package com.zhuqi.redis.sortset;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Component;

import java.util.Set;

/**
 * @author : ZhuQi
 * @version : 时间:2022/1/10 14:56 版本:
 * 测试Redis SortSet
 */
@Component
@Slf4j
public class SortSetRedisTest {


    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 测试内容: redis zset
     */
    public void test() throws Exception {
        ZSetOperations<String, String> zSetOperations = stringRedisTemplate.opsForZSet();
        // 向 zset 添加元素 并设置分数
        zSetOperations.add("score","zhuqi",91.0D);
        zSetOperations.add("score","wang",61.0D);
        zSetOperations.add("score","tian",99.0D);
        zSetOperations.add("score","xiong",89.0D);

        // 向 zset 删除key的某个值
        zSetOperations.remove("score","xiong");

        // 取计算 90 - 100 分之间的元素个数
        Long score = zSetOperations.count("score", 90.0D, 100.0D);
        log.info("分值在90-100直接的有:{}", score);

        // 获取在下标在 0-10 之间 的元素
        Set<String> scoreRange = zSetOperations.range("score", 0L, 10L);
        log.info("输出下标在 0-10 之间的元素:{}", scoreRange);

        // 获取分数在50-60之间的元素
        Set<String> scoreOfRange = zSetOperations.rangeByScore("score", 50.0D, 61.0D);
        log.info("输出分数在50-60之间的元素:{}", scoreOfRange);

        // 拿到某个key中分值最大的元素 旧版本redis 可能不支持该命令
        // ZSetOperations.TypedTuple<String> maxScore = zSetOperations.popMax("score");
        // log.info("最大的元素名:{},分数为:{}", maxScore.getValue(), maxScore.getScore());

        // 返回某个key某个值的索引
        Long rank = zSetOperations.rank("score", "tian");
        log.info("返回该key中某个元素的索引:{}", rank);

        // 返回已经排序了的元素的个数
        Long score1 = zSetOperations.zCard("score");
        log.info("{}", score1);

        // 拿到最小的元素
//        ZSetOperations.TypedTuple<String> score2 = zSetOperations.popMin("score");
//        log.info("最小的元素名:{},分数为:{}", score2.getValue(), score2.getScore());
    }
}
